import re
from models.user import UserModel

class UserService:
    """用户服务类 - 业务逻辑层"""
    
    def __init__(self):
        self.user_model = UserModel()
    
    def get_user_profile(self, username):
        """获取用户个人信息"""
        try:
            user = self.user_model.get_user_by_username(username)
            if not user:
                return {
                    'success': False,
                    'message': '用户不存在',
                    'status_code': 404
                }
            
            # 返回用户信息（不包含密码）
            return {
                'success': True,
                'message': '获取用户信息成功',
                'user': {
                    'id': user['id'],
                    'username': user['username'],
                    'nickname': user['nickname'],
                    'phone': user['phone'],
                    'email': user['email'],
                    'driving_years': user['driving_years'],
                    'city': user['city'],
                    'birthday': user['birthday'].strftime('%Y-%m-%d') if user['birthday'] else None,
                    'bio': user['bio'],
                    'avatar': user['avatar']
                },
                'status_code': 200
            }
        except Exception as e:
            print(f"获取用户信息失败: {e}")
            return {
                'success': False,
                'message': '获取用户信息失败',
                'status_code': 500
            }
    
    def update_user_profile(self, username, user_data):
        """更新用户个人信息"""
        try:
            # 验证电话号码格式（如果提供了电话号码）
            if user_data.get('phone'):
                phone = user_data['phone'].strip()
                if not self.validate_phone(phone):
                    return {
                        'success': False,
                        'message': '电话号码格式不正确',
                        'status_code': 400
                    }
                
                # 检查电话号码唯一性
                if self.user_model.is_phone_exists(phone, username):
                    return {
                        'success': False,
                        'message': '该电话号码已被其他用户使用',
                        'status_code': 400
                    }
            
            # 验证邮箱格式（如果提供了邮箱）
            if user_data.get('email'):
                email = user_data['email'].strip()
                if not self.validate_email(email):
                    return {
                        'success': False,
                        'message': '邮箱格式不正确',
                        'status_code': 400
                    }
                
                # 检查邮箱唯一性
                if self.user_model.is_email_exists(email, username):
                    return {
                        'success': False,
                        'message': '该邮箱已被其他用户使用',
                        'status_code': 400
                    }
            
            # 更新用户信息
            result = self.user_model.update_user(username, user_data)
            
            if result['success']:
                # 获取更新后的用户信息
                updated_user = self.user_model.get_user_by_username(username)
                if not updated_user:
                    return {
                        'success': False,
                        'message': '更新后获取用户信息失败',
                        'status_code': 500
                    }
                            
                return {
                    'success': True,
                    'message': '用户信息更新成功',
                    'user': {
                        'id': updated_user['id'],
                        'username': updated_user['username'],
                        'nickname': updated_user['nickname'],
                        'phone': updated_user['phone'],
                        'email': updated_user['email'],
                        'driving_years': updated_user['driving_years'],
                        'city': updated_user['city'],
                        'birthday': updated_user['birthday'].strftime('%Y-%m-%d') if updated_user['birthday'] else None,
                        'bio': updated_user['bio'],
                        'avatar': updated_user['avatar']
                    },
                    'status_code': 200
                }
            else:
                return {
                    'success': False,
                    'message': result['message'],
                    'status_code': 400
                }
        except Exception as e:
            print(f"更新用户信息失败: {e}")
            return {
                'success': False,
                'message': '更新用户信息失败',
                'status_code': 500
            }
    
    def validate_phone(self, phone):
        """验证电话号码格式"""
        if not phone:
            return True  # 电话号码是可选的
        
        # 简单的电话号码验证（11位数字）
        pattern = r'^1[3-9]\d{9}$'
        return re.match(pattern, phone) is not None
    
    def validate_email(self, email):
        """验证邮箱格式"""
        if not email:
            return True  # 邮箱是可选的
        
        # 简单的邮箱验证
        pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
        return re.match(pattern, email) is not None
    
    def change_password(self, username, current_password, new_password):
        """修改用户密码"""
        try:
            # 获取用户信息
            user = self.user_model.get_user_by_username(username)
            if not user:
                return {
                    'success': False,
                    'message': '用户不存在',
                    'status_code': 404
                }
            
            # 验证原密码
            if not self.user_model.verify_password(current_password, user['password']):
                return {
                    'success': False,
                    'message': '原密码错误',
                    'status_code': 400
                }
            
            # 验证新密码与原密码是否相同
            if current_password == new_password:
                return {
                    'success': False,
                    'message': '新密码不能与原密码相同',
                    'status_code': 400
                }
            
            # 验证新密码格式
            is_valid_password, password_error = self.validate_password(new_password)
            if not is_valid_password:
                return {
                    'success': False,
                    'message': password_error,
                    'status_code': 400
                }
            
            # 加密新密码
            encrypted_password = self.user_model.encrypt_password(new_password)
            
            # 更新密码
            result = self.user_model.update_user(username, {'password': encrypted_password})
            
            if result['success']:
                return {
                    'success': True,
                    'message': '密码修改成功',
                    'status_code': 200
                }
            else:
                return {
                    'success': False,
                    'message': '密码修改失败',
                    'status_code': 500
                }
                
        except Exception as e:
            print(f"修改密码失败: {e}")
            return {
                'success': False,
                'message': '修改密码失败',
                'status_code': 500
            }
    
    def validate_password(self, password):
        """验证密码格式"""
        if not password:
            return False, '密码不能为空'
        
        if len(password) < 6 or len(password) > 18:
            return False, '密码长度必须为6-18个字符'
        
        # 只允许英文和数字
        if not re.match(r'^[a-zA-Z0-9]+$', password):
            return False, '密码只能包含英文和数字'
        
        return True, ''